home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MACD 5
/
MACD 5.bin
/
workbench
/
boot
/
czesc_2
/
smsrc
/
sm
/
window.pas
< prev
Wrap
Pascal/Delphi Source File
|
1995-07-11
|
10KB
|
322 lines
Procedure EnableWindow;
VAR result : boolean;
begin
(* if (OSV39)
* SetWindowPointer(w,TAG_DONE);
* else
* not yet, only got v37 defines... NOT!! :) *)
ClearPointer(w);
(* Enable window input *)
EndRequest(req,w);
(* Enable IDCMP *)
result := ModifyIDCMP(w,idcmp);
end;
Procedure DisableWindow;
VAR result : boolean;
begin
result := ModifyIDCMP(w,IDCMP_REFRESHWINDOW);
(* Block window input *)
result := Request(req,w);
(* Set wait pointer *)
(*if (OSV39)
* SetWindowPointer(w,WA_BusyPointer,TRUE,TAG_DONE);
* else
* not yet, only got v37 defines *)
SetPointer(w,WaitPointer,16,16,-6,0);
end;
{ close the window }
Procedure Close_Window;
Begin
If CD.cd_ScrT = ST_DT then
CloseDTWin(Window2);
If CD.cd_ScrT = ST_RAM then
If Window2 <> NIL then
CloseWindow(Window2);
CloseWindow(TheWindow); { close window and free gadgets and }
FreeGadgets(glist); { visualinfo }
FreeVisualInfo(vi);
End;
{ Inserts a marker at the first occurence of the given character in the }
{ given string. This is then used as the keyboard shortcut for the gadget }
Function UnderIfThere;
VAR
n : byte;
sr : string;
Finished : Boolean;
c : byte;
begin
c := ToUpper(ord(ch));
if c = 0 then begin
UnderIfThere := s;
exit;
end;
if s[length(s)] = #0 then s := copy(s, 1, length(s)-1);
finished := False;
n:=1;
while not finished AND (n <= length(s)) do begin
if c = ToUpper(ord(s[n])) then begin
sr := include('æ', s, n)+#0;
finished := true;
end;
n:=n+1;
end;
if not finished then
sr := s + ' (' + 'æ' + ch + ')' + #0;
UnderIfThere := sr;
end;
{ refresh the window }
Procedure RefreshWin;
begin
GT_BeginRefresh(TheWindow);
GT_EndRefresh(TheWindow, True);
end;
{ open the window }
Function open_window;
CONST
HSpace = 2{INTERWIDTH}; {2}
VSpace = 1{INTERHEIGHT}; {1}
Var
DTags : Array[0..10] Of tTagItem;
GTags : Array[0..1] Of tTagItem;
tags : Array[0..5] of tTagItem;
node : pMyNode;
SampTxt : tIntuiText;
n,i : integer;
sizeofstr : long;
win : pWindow;
Begin
win := NIL;
WindowIDCMP := IDCMP_REFRESHWINDOW | BUTTONIDCMP | IDCMP_CLOSEWINDOW |
IDCMP_MOUSEBUTTONS | IDCMP_VANILLAKEY | IDCMP_INTUITICKS;
glist := NIL;
{ Get visual info and create context }
vi := GetVisualInfoA(TheScreen, NIL);
If vi <> NIL Then begin
pGad := CreateContext(@glist);
if pgad <> NIL then begin
{ Find longest gadget name and determine size }
node := pMyNode(CurrentList^.lh_Head);
sizeofstr := 0;
With SampTxt do begin
FrontPen := 0;
BackPen := 0;
DrawMode := 0;
LeftEdge := 0;
TopEdge := 0;
ITextFont := @CD.cd_Font;
IText := @Tmpstr[1];
NextText := NIL;
end;
While pMyNode(node^.LSK_Node.ln_Succ) <> NIL do begin
tmpstr := node^.LSK_Name+' (XX)'#0;
{$IFDEF DEBUG}
{Writeln('Size check, node name : ',tmpstr);}
{$ENDIF}
If IntuiTextLength(@SampTxt) > sizeofstr then
sizeofstr := IntuiTextLength(@SampTxt);
node := pMyNode(node^.LSK_Node.ln_Succ);
end;
Sizes[TBS] := TheScreen^.WBorTop + (TheScreen^.Font^.ta_YSize + 1);
ZoomS[3] := Sizes[TBS];
Sizes[GAD_W] := sizeofstr+(2*MyTextFont^.tf_XSize);
sizes[S_WB_T] := TheScreen^.WBorTop;
sizes[S_WB_L] := TheScreen^.WBorLeft;
sizes[S_WB_R] := TheScreen^.WBorRight;
sizes[S_WB_B] := TheScreen^.WBorBottom;
If CD.cd_ScrT = ST_RAM then begin
DTags[0].ti_Tag := WA_Left;
DTags[0].ti_Data := 0;
DTags[1].ti_Tag := WA_Top;
DTags[1].ti_Data := Sizes[TBS]+1;
DTags[2].ti_Tag := WA_Height;
DTags[2].ti_Data := TheScreen^.Font^.ta_YSize*3;
DTags[3].ti_Tag := WA_BackDrop;
DTags[3].ti_Data := True_;
DTags[4].ti_Tag := WA_Borderless;
DTags[4].ti_Data := True_;
DTags[5].ti_Tag := WA_PubScreen;
DTags[5].ti_Data := LONG(TheScreen);
DTags[6].ti_Tag := WA_IDCMP;
DTags[6].ti_Data := IDCMP_REFRESHWINDOW;
DTags[7].ti_Tag := TAG_END;
Window2 := OpenWindowTaglist(NIL,@DTags);
{$IFDEF DEBUG}
if Window2 <> NIL then
Writeln('Backdrop Window OK');
{$ENDIF}
end else Window2 := NIL;
If CD.cd_ScrT = ST_DT then
Window2 := OpenDTWin(CSCPAR( @RememberKey, CD.cd_DT));
{ Initilise gadget struncture and tags }
Tags[0].ti_Tag := GTTX_Text;
Tags[0].ti_Data := LONG(NIL);
Tags[1].ti_Tag := GTTX_Border;
Tags[1].ti_Data := True_;
Tags[2].ti_Tag := GTTX_CopyText;
Tags[2].ti_Data := False_;
Tags[3].ti_Tag := GTTX_Justification;
Tags[3].ti_Data := GTJ_CENTER;
Tags[4].ti_Tag := GTTX_Clipped;
Tags[4].ti_Data := True_;
Tags[5].ti_Tag := TAG_END;
GTags[0].ti_Tag := GT_UnderScore;
GTags[0].ti_Data := LONG('æ');
GTags[1].ti_Tag := TAG_END;
With GadgetFlags Do Begin
ng_TextAttr := @CD.cd_Font;
ng_LeftEdge := sizes[S_WB_L]+HSpace+1;
ng_Width := Sizes[GAD_W];
ng_Height := Sizes[GAD_H];
ng_VisualInfo := vi;
ng_GadgetID := 0;
End;
{ traverse down list creating gadgets, producing a recessed
text display if LSK_Name is 'COMMENT' }
node := pMyNode(CurrentList^.lh_Head);
For n := 1 to CD.cd_Down do begin
GadgetFlags.ng_TopEdge := Sizes[TBS] + VSpace +1 + (n-1)*(Sizes[GAD_H]+VSpace);
For i := 1 to CD.cd_Across do begin
With GadgetFlags Do begin
ng_LeftEdge := sizes[S_WB_L] + (i-1)*(ng_Width+HSpace) + HSpace;
If pMyNode(node^.LSK_Node.ln_Succ) <> NIL then begin
{$IFDEF DEBUG}
Writeln('Creating Gadget for ',node^.LSK_Name);
{$ENDIF}
IF UpperStr(node^.LSK_Cmd[1]) = 'COMMENT' then begin
Tags[0].ti_Data := LONG(CSCPAR( @RememberKey, node^.LSK_Name));
ng_GadgetText := NIL;
ng_GadgetID := 0;
pGad := CreateGadgetA(TEXT_KIND, pGad, @Gadgetflags, @Tags);
end else begin
if node^.LSK_Key <> '' then
ng_GadgetText := CSCPAR( @RememberKey, UnderIfThere(node^.LSK_Name, Node^.LSK_Key[1]))
else
ng_GadgetText := CSCPAR( @RememberKey, node^.LSK_Name);
ng_UserData := node;
ng_GadgetID := 1;
pGad := CreateGadgetA(BUTTON_KIND, pGad, @Gadgetflags, @GTags);
end;
end else begin { We dont want to traverse out of the list }
Tags[0].ti_Data := LONG(NIL);
ng_GadgetText := NIL;
ng_GadgetID := 0;
pGad := CreateGadgetA(TEXT_KIND, pGad, @Gadgetflags, @tags);
End;
End;
pGad := CreateGadgetA(BUTTON_KIND, pGad, @Gadgetflags, NIL);
If pMyNode(node^.LSK_Node.ln_Succ) <> NIL then
node := pMyNode(node^.LSK_Node.ln_Succ);
end;
end;
{$IFDEF DEBUG}
Writeln('User Gadgets created');
{$ENDIF}
{ Border around scrolling text, use a TD gadget so we dont have
to worry about refreshing a bevelbox }
if CD.cd_Wit then begin
Tags[0].ti_Tag := GTTX_Text;
Tags[0].ti_Data := LONG(NIL);
Tags[1].ti_Tag := GTTX_Border;
Tags[1].ti_Data := True_;
Tags[2].ti_Tag := TAG_END;
With GadgetFlags Do Begin
ng_GadgetText := NIL;
ng_UserData := NIL;
ng_GadgetID := 0;
ng_TopEdge := ng_TopEdge + Sizes[TBS] + VSPACE +1;
ng_Width := ng_Width + ng_LeftEdge - sizes[S_WB_L] - 2;
ng_LeftEdge := sizes[S_WB_L] + 2;
ng_Height := CD.cd_SFont.ta_YSize+9;
end;
pGad := CreateGadgetA(TEXT_KIND, pGad, @Gadgetflags, @tags);
end;
{$IFDEF DEBUG}
if pgad <> NIL then
Writeln('Gadget creation OK');
{$ENDIF}
{ check nothing went wrong in the gadget production }
If pGad <> NIL Then begin
Base := (GadgetFlags.ng_TopEdge+GadgetFlags.ng_Height)-5;
{ window tags }
DTags[0].ti_Tag := WA_Width;
DTags[0].ti_Data := GadgetFlags.ng_LeftEdge+GadgetFlags.ng_Width + sizes[S_WB_R] + 2;
DTags[1].ti_Tag := WA_Height;
DTags[1].ti_Data := GadgetFlags.ng_TopEdge+GadgetFlags.ng_Height+3;
DTags[2].ti_Tag := WA_Left;
DTags[2].ti_Data := (TheScreen^.Width div 2) - (DTags[0].ti_Data div 2);
DTags[3].ti_Tag := WA_Top;
DTags[3].ti_Data := Sizes[TBS]+(((TheScreen^.Height-Sizes[TBS]) div 2) - (DTags[1].ti_Data div 2));
DTags[4].ti_Tag := WA_IDCMP;
DTags[4].ti_Data := WindowIDCMP;
if CD.cd_ScrT = ST_BACK then begin
DTags[5].ti_Tag := WA_Flags;
DTags[5].ti_Data := WFLG_BACKDROP|WFLG_BORDERLESS;
DTags[6].ti_Tag := TAG_IGNORE;
DTags[6].ti_Data := 0;
end else begin
DTags[5].ti_Tag := WA_Flags;
DTags[5].ti_Data := WFLG_CLOSEGADGET|WFLG_DRAGBAR|WFLG_DEPTHGADGET;
DTags[6].ti_Tag := WA_Title;
DTags[6].ti_Data := LONG(CSCPAR( @RememberKey, CD.cd_WinTit));
end;
DTags[5].ti_Data := DTags[5].ti_Data|WFLG_ACTIVATE|WFLG_SIMPLE_REFRESH|WFLG_RMBTRAP;
DTags[7].ti_Tag := WA_Gadgets;
DTags[7].ti_Data:= LONG(gList);
DTags[8].ti_Tag := WA_CustomScreen;
DTags[8].ti_Data:= LONG(TheScreen);
DTags[9].ti_Tag := WA_Zoom;
DTags[9].ti_Data:= LONG(@ZoomS);
DTags[10].ti_Tag := TAG_DONE;
{ Open window }
Win := OpenWindowTaglist(NIL,@DTags);
If Win <> NIL Then
{$IFDEF DEBUG}
Writeln('Main Window OK');
{$ENDIF}
{ Initial refresh of the gadgets }
GT_RefreshWindow(Win, NIL);
end;
end;
end;
Open_Window := win;
End;